package com.bootdo.api.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
 
/**
 * Json与javaBean之间的转换工具类
 * 
 * @version 20111221
 * 
 * {@code   现使用json-lib组件实现
 *          需要
 *              json-lib-2.4-jdk15.jar
 *              ezmorph-1.0.6.jar
 *              commons-collections-3.1.jar
 *              commons-lang-2.0.jar
 *          支持
 * }
 */
@SuppressWarnings({"rawtypes","unchecked"})
public class JsonPluginsUtil {
	/**
	 * 从一个JSON 对象字符格式中得到一个java对象
	 * 
	 * @param jsonString
	 * @param beanCalss
	 * @return
	 */
	public static <T> T jsonToBean(String jsonString, Class<T> beanCalss) {
		JSONObject jsonObject = JSONObject.fromObject(jsonString);
		JsonConfig jsonConfig = new JsonConfig();
		jsonObject.names(jsonConfig);
		T bean = (T) JSONObject.toBean(jsonObject, beanCalss);
		return bean;
	}

	/**
	 * 将数据流转换为对象
	 * @param inputStream
	 * @param beanCalss
	 * @return
	 */
	public static <T> T inputStreamToBean(InputStream inputStream, Class<T> beanCalss) {
		StringBuffer buf = new StringBuffer();
		BufferedReader br;
		T bean = null;
		try {
			br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
			String line;
			while (null != (line = br.readLine())) {
				buf.append(line).append("\n");
			}
			bean = (T) JsonPluginsUtil.jsonToBean(buf.toString(), beanCalss);
		} catch (IOException e) {
			e.printStackTrace();
		} 
		return bean;
	}

	/**
	 * 将java对象转换成json字符串
	 *
	 * @param bean
	 * @return
	 */
	public static String beanToJson(Object bean) {
		JsonConfig jsonConfig = new JsonConfig();
		//设置 json拼接参数顺序
//		jsonConfig.registerJsonBeanProcessor(bean.getClass(), new JsonBeanProcessorSort());
		
//		//设置 指定类型转String的格式
//		jsonConfig.registerJsonValueProcessor(bean.getClass(),new JsonDateValueProcessor());
		jsonConfig.registerJsonValueProcessor(Date.class,new JsonDateValueProcessor());
		jsonConfig.registerJsonValueProcessor(java.sql.Date.class,new JsonDateValueProcessor());
		jsonConfig.registerJsonValueProcessor(Timestamp.class,new JsonDateValueProcessor());
		jsonConfig.setJsonPropertyFilter(new JsonPropertyFilter());
		JSONObject json = JSONObject.fromObject(bean, jsonConfig);
		//排序
		json = JsonBeanSort.sort(json, bean);
		//空值不显示
		return json.toString();
	}
	

	/**
	 * 将java对象转换成json字符串
	 * @param bean
	 * @param _nory_changes 筛选字段
	 * @param nory true:不过滤  false:过滤
	 * @return
	 */
	public static String beanToJson(Object bean, String[] _nory_changes, boolean nory) {

		JSONObject json = null;
		if (nory) {// 转换_nory_changes里的属性
			Field[] fields = bean.getClass().getDeclaredFields();
			String str = "";
			for (Field field : fields) {
				// System.out.println(field.getName());
				str += (":" + field.getName());
			}
			fields = bean.getClass().getSuperclass().getDeclaredFields();
			for (Field field : fields) {
				// System.out.println(field.getName());
				str += (":" + field.getName());
			}
			str += ":";
			for (String s : _nory_changes) {
				str = str.replace(":" + s + ":", ":");
			}
			json = JSONObject.fromObject(bean, configJson(str.split(":")));
		} else {// 转换除了_nory_changes里的属性
			json = JSONObject.fromObject(bean, configJson(_nory_changes));
		}
		return json.toString();
	}

	private static JsonConfig configJson(String[] excludes) {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setExcludes(excludes);
		jsonConfig.setIgnoreDefaultExcludes(false);
		return jsonConfig;

	}

	/**
	 * 将java对象List集合转换成json字符串
	 * 
	 * @param beans
	 * @return
	 */
	public static String beanListToJson(List beans) {
		StringBuffer rest = new StringBuffer();
		rest.append("[");
		int size = beans.size();
		for (int i = 0; i < size; i++) {
			rest.append(beanToJson(beans.get(i)) + ((i < size - 1) ? "," : ""));
		}
		rest.append("]");
		return rest.toString();
	}

	/**
	 * 
	 * @param beans
	 * @param _no_changes
	 * @return
	 */
	public static String beanListToJson(List beans, String[] _nory_changes, boolean nory) {
		StringBuffer rest = new StringBuffer();
		rest.append("[");
		int size = beans.size();
		for (int i = 0; i < size; i++) {
			try {
				rest.append(beanToJson(beans.get(i), _nory_changes, nory));
				if (i < size - 1) {
					rest.append(",");
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		rest.append("]");
		return rest.toString();
	}

	/**
	 * 从json HASH表达式中获取一个map，改map支持嵌套功能
	 *
	 * @param jsonString
	 * @return
	 */
	public static Map jsonToMap(String jsonString) {
		JSONObject jsonObject = JSONObject.fromObject(jsonString);
		Iterator keyIter = jsonObject.keys();
		String key;
		Object value;
		Map valueMap = new HashMap();
		while (keyIter.hasNext()) {
			key = (String) keyIter.next();
			value = jsonObject.get(key).toString();
			valueMap.put(key, value);
		}
		return valueMap;
	}

	/**
	 * map集合转换成json格式数据
	 * 
	 * @param map
	 * @return
	 */
	public static String mapToJson(Map<String, ?> map, String[] _nory_changes, boolean nory) {
		String s_json = "{";
		Set<String> key = map.keySet();
		for (Iterator<?> it = key.iterator(); it.hasNext();) {
			String s = (String) it.next();
			if (map.get(s) == null) {

			} else if (map.get(s) instanceof List<?>) {
				s_json += (s + ":" + JsonPluginsUtil.beanListToJson((List<?>) map.get(s), _nory_changes, nory));

			} else {
				JSONObject json = JSONObject.fromObject(map);
				s_json += (s + ":" + json.toString());
				;
			}

			if (it.hasNext()) {
				s_json += ",";
			}
		}
		s_json += "}";
		return s_json;
	}

	/**
	 * 从json数组中得到相应java数组
	 *
	 * @param jsonString
	 * @return
	 */
	public static Object[] jsonToObjectArray(String jsonString) {
		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		return jsonArray.toArray();
	}

	public static String listToJson(List<?> list) {
		JSONArray jsonArray = JSONArray.fromObject(list);
		return jsonArray.toString();
	}

	/**
	 * 从json对象集合表达式中得到一个java对象列表
	 *
	 * @param jsonString
	 * @param beanClass
	 * @return
	 */
	public static <T> List<T> jsonToBeanList(String jsonString, Class<T> beanClass) {
		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		JSONObject jsonObject;
		T bean;
		int size = jsonArray.size();
		List<T> list = new ArrayList<T>(size);

		for (int i = 0; i < size; i++) {
			jsonObject = jsonArray.getJSONObject(i);
			bean = (T) JSONObject.toBean(jsonObject, beanClass);
			list.add(bean);
		}
		return list;

	}

	/**
	 * 从json数组中解析出java字符串数组
	 *
	 * @param jsonString
	 * @return
	 */
	public static String[] jsonToStringArray(String jsonString) {
		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		String[] stringArray = new String[jsonArray.size()];
		int size = jsonArray.size();
		for (int i = 0; i < size; i++) {
			stringArray[i] = jsonArray.getString(i);
		}
		return stringArray;
	}

	/**
	 * 从json数组中解析出javaLong型对象数组
	 *
	 * @param jsonString
	 * @return
	 */
	public static Long[] jsonToLongArray(String jsonString) {
		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		int size = jsonArray.size();
		Long[] longArray = new Long[size];
		for (int i = 0; i < size; i++) {
			longArray[i] = jsonArray.getLong(i);
		}
		return longArray;
	}

	/**
	 * 从json数组中解析出java Integer型对象数组
	 *
	 * @param jsonString
	 * @return
	 */
	public static Integer[] jsonToIntegerArray(String jsonString) {
		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		int size = jsonArray.size();
		Integer[] integerArray = new Integer[size];

		for (int i = 0; i < size; i++) {
			integerArray[i] = jsonArray.getInt(i);
		}
		return integerArray;
	}

	/**
	 * 从json数组中解析出java Double型对象数组
	 *
	 * @param jsonString
	 * @return
	 */
	public static Double[] jsonToDoubleArray(String jsonString) {
		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		int size = jsonArray.size();
		Double[] doubleArray = new Double[size];
		for (int i = 0; i < size; i++) {
			doubleArray[i] = jsonArray.getDouble(i);
		}
		return doubleArray;
	}
 
}